package cn.blogsx.reflect;

import cn.blogsx.domain.Person;

import java.lang.reflect.Field;
import java.util.stream.Stream;

/**
 * 反射的功能：
 *    1.获取成员变量们
 *          * Field[] getFields() 获取所有public修饰的成员变量
 *          * Field getField(String name) 获取指定名称的public修饰的成员变量
 *
 *          * Field[] getDeclaredFields() //获取所有的成员变量
 *          * Field getField(String name)
 *    2.获取构造方法们
 *          * Constructor<?>[] getConstructors()
 *          * Constructor<T> getConstructor(Class<?>... parameterTypes)
 *
 *          * Constructor<?>[] getDeclaredConstructors()
 *          * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
 *
 *    3.获取成员方法们
 *          * Method[] getMethods()
 *          * Method getMethod(String name, Class<?>... parameterTypes)
 *          * Method[] getDeclaredMethods()

 *    4.获取类名
 *          * String getName();
 *
 * Field:成员变量
 *  * 操作：
 *      1、设置值
 *           void set(Object obj, Object value)
 *      2、获取值
 *           Object get(Object obj)
 *      3、忽略访问修饰符的安全检查
 *          字段名setAccessible(true); //暴力反射
 */
public class Demo02ReflectFunction {
    public static void main(String[] args) throws Exception {
        //0.获取Person的Class对象
        Class personClass = Person.class;

        //1.获取public 修饰的成员变量们
//        Field[] fields = personClass.getFields();
//        Stream.of(fields).forEach(System.out::println);

        //获取指定名称的成员变量
        Field test = personClass.getField("test");
        //获取成员变量的的值
        Person p = new Person();
        Object value = test.get(p);
        System.out.println(value);
        //设置成员变量的值
        test.set(p,"测试字段");
        System.out.println(p);

        //2.获取所有成员变量们,不考虑修饰符
//        Field[] declaredFields = personClass.getDeclaredFields();
//        Stream.of(declaredFields).forEach(System.out::println);
        //获取指定的字段
        Field age = personClass.getDeclaredField("age");
        // 忽略访问修饰符的安全检查
        age.setAccessible(true); //暴力反射
        Object value2 = age.get(p);
        System.out.println(value2);
        age.set(p,19);
        System.out.println(p);




    }
}
